package org.ws.task.model;


import java.io.Serializable;

/**
 * 任务配置信息
 */
public class TaskConfig implements Serializable {

    public TaskConfig() {
    }

    public TaskConfig(String name) {
        this.name = name;
    }

    /**
     * 任务名称：唯一
     */
    private String name;
    /**
     * 每次获取任务分快数量
     */
    private Integer chunk = 10;

    /**
     * 执行任务的worker数量。
     * -1 = 全部。
     * x = 分配x节点
     */
    private Integer workerNum = -1;

    /**
     * 获取任务方式
     */
    private TaskType taskType = TaskType.PULL;

    /**
     * 分发策略：服务端使用
     */
    private DispatchStrategy dispatchStrategy = DispatchStrategy.POLL;

    /**
     * 拉取超时
     */
    private Long fetchTimeout = 1_000L;

    /**
     * leader端是否需要处理任务，
     * 单节点：只有一个节点既是leader也是worker
     * 多节点：leader节点只负责分发不负责处理任务
     */
    private Boolean leaderProcess = true;

    /**
     * 默认集群模式
     */
    private SendModel sendModel = SendModel.CLUSTERING;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getChunk() {
        return chunk;
    }

    public void setChunk(Integer chunk) {
        this.chunk = chunk;
    }

    public Integer getWorkerNum() {
        return workerNum;
    }

    public void setWorkerNum(Integer workerNum) {
        this.workerNum = workerNum;
    }

    public TaskType getTaskType() {
        return taskType;
    }

    public void setTaskType(TaskType taskType) {
        this.taskType = taskType;
    }

    public DispatchStrategy getDispatchStrategy() {
        return dispatchStrategy;
    }

    public void setDispatchStrategy(DispatchStrategy dispatchStrategy) {
        this.dispatchStrategy = dispatchStrategy;
    }

    public Long getFetchTimeout() {
        return fetchTimeout;
    }

    public void setFetchTimeout(Long fetchTimeout) {
        this.fetchTimeout = fetchTimeout;
    }

    public Boolean getLeaderProcess() {
        return leaderProcess;
    }

    public void setLeaderProcess(Boolean leaderProcess) {
        this.leaderProcess = leaderProcess;
    }

    public SendModel getSendModel() {
        return sendModel;
    }

    public void setSendModel(SendModel sendModel) {
        this.sendModel = sendModel;
    }

    /**
     * 获取方式
     * 拉数据：worker端主动拉取数据处理，根据配置leader统一调度分配
     * 推数据：任一worker端都可以推送数据到leader端，由leader统一调度分配再对数据进行处理
     */
    public enum TaskType {
        PULL,   // 拉
        PUSH    // 推
    }

    /**
     * 获取策略
     */
    public enum DispatchStrategy {
        POLL,   // 轮询
        RANDOM, // 随机
        HASH    // Hash需指定HashKey
    }

    /**
     * 发送类型
     */
    public enum SendModel {
        BROADCASTING, // 广播：每一条消息全部发送到每一个Worker
        CLUSTERING; // 集群：每一条消息只发送到一个Worker
    }


}
